home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The World's Largest Collection of Windows Software
/
The World's Largest Collection of Windows Software - Disc 2.iso
/
win
/
pro207
/
setup.ms_
/
setup.bin
Wrap
Text File
|
1993-03-14
|
21KB
|
725 lines
'**************************************************************************
'* FoxPro/Windows Installation
'**************************************************************************
'$INCLUDE 'setup.inc'
DECLARE FUNCTION GetProgMgrGrps LIB "mscuistf.dll" AS INTEGER
DECLARE FUNCTION QuietConfigUpdate LIB "mscuistf.dll" AS INTEGER
DECLARE FUNCTION CanFindConfigSys LIB "mscuistf.dll" AS INTEGER
DECLARE FUNCTION CalcListSize LIB "mscuistf.dll" AS LONG
DECLARE FUNCTION WindowWidth LIB "mscuistf.dll" (iWind%) AS INTEGER
DECLARE FUNCTION WindowHeight LIB "mscuistf.dll" (iWind%) AS INTEGER
DECLARE FUNCTION InsertFile LIB "mscuistf.dll" (szDestFile$, szSourceFile$) AS INTEGER
DECLARE FUNCTION Spawn LIB "mscuistf.dll" (szCommand$, szDir$) AS INTEGER
''Local functions and procedures.
DECLARE SUB AddToPM
DECLARE SUB ConfirmQuit
DECLARE SUB CreateCopyList
DECLARE SUB DoRestart
DECLARE SUB Install
DECLARE SUB GetPathInfo
DECLARE SUB GetPathGrpInfo
DECLARE SUB GetUserDefaults
DECLARE SUB UpdateConfig
DECLARE SUB UpdateINI
DECLARE FUNCTION ConfirmNameOrg () AS STRING
DECLARE FUNCTION EnoughSpace () AS STRING
DECLARE FUNCTION MakePath (szDir$, szFile$) AS STRING
DECLARE FUNCTION SectionSize (szSection$) AS INTEGER
DECLARE FUNCTION WarnBadPath () AS STRING
''Dialog ID's
CONST ASKQUIT = 200 ''Is the user certain they want to quit?
CONST BADINI = 4500 ''We couldn't read setup.ini.
CONST BADMODE = 2100 ''We aren't in Enhanced mode.
CONST BADNAME = 7700 ''The user has to enter a name.
CONST BADPATH = 6400 ''The target directory can't be written to.
CONST BADPATH_FORCED = 6200 ''The target directory is bad, but the user can't change it.
CONST BILLBOARD = 20000 ''Used to hold billboard bitmaps.
CONST CANTADDRSC = 4700 ''Can't add resource to foxprow.exe
CONST CANTFIND = 3900 ''Can't find config.sys.
CONST CANTQUIT = 2300 ''Couldn't exit Windows.
CONST CANTSPAWN = 6500 ''Couldn't run optional stuff.
CONST CANTUPDATE = 3500 ''Coulsn't update config.sys.
CONST CANTWRITETOFP = 5200 ''FoxPro is in a read only directory.
CONST CONFIRMINFO = 7300 ''Is the name and organization ok?
CONST DESTPATH = 5300 ''Get target directory without a group.
CONST DESTPATHGROUP = 5400 ''Get target directory and group.
CONST DISKFULL = 5500 ''Not enough disk space is available.
CONST DISKFULL_BACK = 6100 ''Not enough disk space is available, change path?
CONST DISKWINFULL = 5600 ''Not enough space on Windows drive.
CONST EDITCONFIG = 2700 ''Review changes to config.sys
CONST EDITMODE = 3800 ''Select method of updating config.sys
CONST EDITOK = 3700 ''We updated config.sys
CONST EXITFAILURE = 5700 ''We are quiting due to an error.
CONST EXITNOICON = 2800 ''We installed, but don't have an icon.
CONST EXITQUIT = 5800 ''We were forced to quit by the user.
CONST EXITSUCCESS = 5900 ''We have successfully finished.
CONST GETNAMEORG = 1300 ''Get the user's name and organization.
CONST NOPROD = 5100 ''Path to foxprow.exe is bad.
CONST NOT386 = 1800 ''Machine is less than a 386SX.
CONST OPTIONS = 800 ''Components to install.
CONST REINSTALL = 2000 ''Copy disincentive message.
CONST RESTARTWIN = 2200 ''Warn before restarting windows.
CONST WAITADDRSC = 4900 ''Wait while adding FOXT.EXE.
CONST WAITINI = 6600 ''Wait while updating INI files.
CONST WAITSPACE = 6700 ''Wait while getting free disk space.
CONST MSGRAPH = 1
CONST APPLICATION = 2
CONST SYSFILES = 3
CONST CUIDLL$ = "mscuistf.dll" ''The .DLL containing our dialog routines.
CONST DEFAULT_TITLE$ = "Setup"
CONST LOGO = 2 ''Logo Bitmap ID.
CONST LASTRESORT$ = "Setup was damaged. Please try a new set of disks."
CONST LASTTITLE$ = "Setup Error"
CONST MINFILES% = 40
CONST NO = 0
CONST NOGROUP$ = "- NONE -" ''Group name which means don't create a group.
CONST README$ = "README.TXT"
CONST READ_DESC$ = "Read Me"
CONST YES = 1
GLOBAL DEST$ ''Default destination directory.
GLOBAL fGRAPH% ''Flag indicating if the graph runtime is to be installed.
GLOBAL fWIN31% ''Flag indicating if we are running under 3.1 or later.
GLOBAL GROUP$ ''Default destination group.
GLOBAL MODE$ ''Determines whether we let the user change path and/or group.
GLOBAL MSDEST$ ''MS Graph runtime location.
GLOBAL PM_EXE$ ''Exe to add to the PM.
GLOBAL PM_DESCRIPT$ ''Label for the PM.
GLOBAL QUIT_PROG$ ''Program to execute when we quit.
GLOBAL SRCDIR$ ''Location of install files.
GLOBAL szInf$ ''Location of the inf file.
GLOBAL WINDIR$ ''Windows directory.
GLOBAL WINSYSDIR$ ''Windows system directory.
INIT:
ON ERROR GOTO QUIT
DEST$ = "c:\foxprow"
DLG% = 400
fGRAPH% = NO
GROUP$ = "FoxPro for Windows"
MODE$ = "NO"
MSDEST$ = MakePath(GetWindowsDir(), "msapps")
PMGROUPS% = 0
QUIT_PROG$ = ""
SRCDIR$ = GetSymbolValue("STF_SRCDIR")
WINDIR$ = GetWindowsDir()
WINSYSDIR$ = GetWindowsSysDir()
szInf$ = GetSymbolValue("STF_SRCINFPATH")
IF szInf$ = "" THEN
szInf$ = GetSymbolValue("STF_CWDDIR") + "SETUP.INF"
END IF
ReadInfFile szInf$
fGRAPH% = DoesIniSectionExist(szInf$, "MSGraph")
SetSymbolValue "NoGroup", NOGROUP$
'' SetBitmap CUIDLL$, LOGO
''
'' Make sure we have at least a 386SX.
''
IF GetProcessorType() < 3 THEN
PROCESSOR:
sz$ = UIStartDlg(CUIDLL$, NOT386, "FInfo0DlgProc", 0, "")
IF sz$ = "EXIT" OR sz$ = "CANCEL" THEN
ConfirmQuit
GOTO PROCESSOR
END IF
UIPop 1
END
END IF
''
'' Warn the user if we are not in Enhanced mode.
''
IF GetWindowsMode() < 2 THEN
ENHANCED:
sz$ = UIStartDlg(CUIDLL$, BADMODE, "FInfoDlgProc", 0, "")
IF sz$ = "EXIT" OR sz$ = "CANCEL" THEN
ConfirmQuit
GOTO ENHANCED
ELSE
UIPop 1
END IF
END IF
''
'' Get the user's choices for window titles, default directories, etc.
''
GetUserDefaults
''
'' For our own use, see if we are running on a version later than 3.0.
''
fWIN31% = YES
IF GetWindowsMajorVersion() < 3 THEN
fWIN31% = NO
ELSEIF GetWindowsMajorVersion() = 3 AND GetWindowsMinorVersion() = 0 THEN
fWIN31% = NO
END IF
''
'' Get a list of PM groups if possible.
''
IF fWIN31% = YES THEN
PMGROUPS% = GetProgMgrGrps()
END IF
''
'' Have the user specify where to put the product. (Including the group if
'' we can get the info.)
''
GETTARGETINFO:
IF MODE$ <> "YES" THEN
IF fWIN31% = NO OR GetListLength("ListItemsIn") = 0 OR MODE$ = "GROUP ONLY" THEN
GetPathInfo
ELSE
GetPathGrpInfo
END IF
ELSE
IF IsDirWritable(DEST$) = NO THEN
sz$ = UIStartDlg(CUIDLL$, BADPATH_FORCED, "FInfoDlgProc", 0, "")
ERROR STFERR
END IF
END IF
IF EnoughSpace() = "BACK" THEN
GOTO GETTARGETINFO
END IF
''
'' Try to gaurantee that FILES are at least a minimum value.
''
UpdateConfig
Install
IF ERR = STFQUIT THEN
DLG% = EXITQUIT
ELSE
DLG% = EXITSUCCESS
END IF
GOTO QUITL1
QUIT:
UIPopAll
IF ERR = STFPROGMAN THEN
DLG% = EXITNOICON
ELSEIF ERR = STFQUIT THEN
DLG% = EXITQUIT
ELSE
DLG% = EXITFAILURE
END IF
QUITL1:
ON ERROR GOTO TOAST
IF DLG% = EXITSUCCESS AND LEN(QUIT_PROG$) <> 0 THEN
QUIT_PROG$ = MakePath(DEST$, QUIT_PROG$)
IF (MID$(DEST$, LEN(DEST$), 1) = "\") THEN
y$ = MID$(DEST$, 1, LEN(DEST$)-1)
ELSE
y$ = DEST$
END IF
x% = Spawn(QUIT_PROG$, y$)
IF x% <> 0 THEN
SetSymbolValue "EXE_NAME", QUIT_PROG$
sz$ = UIStartDlg(CUIDLL$, DLG%, "FVarStringDlgProc", 0, "")
UIPop 1
DLG% = EXITFAILURE
ELSE
UIPop ALL
END
END IF
END IF
QUITL2:
IF DLG% <> EXITSUCCESS OR LEN(QUIT_PROG$) = 0 THEN
sz$ = UIStartDlg(CUIDLL$, DLG%, "FInfoDlgProc", 0, "")
IF sz$ = "REACTIVATE" THEN
GOTO QUITL2
END IF
UIPop ALL
END IF
END
TOAST:
UIPopAll
x% = DoMsgBox(LASTRESORT$, LASTTITLE$, MB_OK+MB_TASKMODAL+MB_ICONHAND)
END
'**
'** Purpose:
'** Copies the files in the copy list and adds FoxPro to the target
'** group if one was psecified.
'** Arguments:
'** none.
'** Returns:
'** none.
'*************************************************************************
SUB Install STATIC
''
'' Do the copy
''
CreateCopyList
SetRestartDir GetSymbolValue("STF_CWDDIR")
CopyFilesInCopyList
AddToPM
UpdateINI
IF RestartListEmpty() = 0 THEN
DoRestart
END IF
END SUB
'**
'** Purpose:
'** Creates the PM group and items(s).
'** Arguments:
'** none.
'** Returns:
'** none.
'*************************************************************************
SUB AddToPM STATIC
IF GROUP$ <> NOGROUP$ AND LEN(PM_EXE$) <> 0 THEN
CreateProgmanGroup GROUP$, "", cmoNone
IF LEN(PM_EXE$) > 0 THEN
y$ = MakePath(DEST$, PM_EXE$)
IF fWIN31% = YES THEN
CreateProgmanItem GROUP$, PM_DESCRIPT$, y$, y$+",0,0,0,"+DEST$, cmoOverwrite
ELSE
CreateProgmanItem GROUP$, PM_DESCRIPT$, y$, "", cmoOverwrite
END IF
END IF
y$ = MakePath(DEST$, README$)
IF DoesFileExist(y$, femExists) = YES THEN
CreateProgmanItem GROUP$, READ_DESC$, y$, "", cmoOverwrite
END IF
ShowProgmanGroup GROUP$, 1, cmoNone
END IF
END SUB
'**
'** Purpose:
'** Exits to DOS to update Window's system files which were in use.
'** Arguments:
'** none.
'** Returns:
'** none.
'*************************************************************************
SUB DoRestart STATIC
RESTARTBEGIN:
sz$ = UIStartDlg(CUIDLL$, RESTARTWIN, "FInfoDlgProc", 0, "")
IF sz$ = "EXIT" OR sz$ = "CANCEL" THEN
ConfirmQuit
GOTO RESTARTBEGIN
END IF
UIPop 1
TRYTOQUIT:
IF ExitExecRestart() = 0 THEN
TRYTOQUITL2:
sz$ = UIStartDlg(CUIDLL$, CANTQUIT, "FInfoDlgProc", 0, "")
IF sz$ = "EXIT" OR sz$ = "CANCEL" THEN
ConfirmQuit
GOTO TRYTOQUITL2
END IF
GOTO TRYTOQUIT
END IF
END SUB
'**
'** Purpose:
'** Updates any INI files that need it and does any other misc. updates.
'** Arguments:
'** none.
'** Returns:
'** none.
'*************************************************************************
SUB UpdateINI STATIC
IF fGRAPH% = YES THEN
oldCursor% = ShowWaitCursor()
sz$ = UIStartDlg(CUIDLL$, WAITINI, "FNoWaitDlgProc", 0, "")
CreateIniKeyValue "WIN.INI", "MSAPPS", "msapps", MSDEST$, cmoOverwrite
CreateRegKeyValue "MSGraph", "MS Graph Developer Edition"
CreateRegKeyValue ".gra", "MSGraph"
CreateRegKeyValue "MSGraph\protocol\StdFileEditing\server", MakePath(MSDEST$,"msgraph\graph.exe")
CreateRegKeyValue "MSGraph\protocol\StdFileEditing\SetDataFormats", "Native,CF_TEXT"
CreateRegKeyValue "MSGraph\protocol\StdFileEditing\RequestDataFormats", "Native,CF_METAFILEPICT"
CreateRegKeyValue "MSGraph\protocol\StdExecute\server", MakePath(MSDEST$,"msgraph\graph.exe")
UIPop 1
RestoreCursor oldCursor%
END IF
END SUB
'**
'** Purpose:
'** Gets the path where the user wishes to install FoxPro.
'** Arguments:
'** none.
'** Returns:
'** none.
'*************************************************************************
SUB GetPathInfo STATIC
SetSymbolValue "EditTextIn", LCASE$(DEST$)
GETPATHINFOSTART:
sz$ = UIStartDlg(CUIDLL$, DESTPATH, "FEditDlgProc", 0, "")
DEST$ = GetSymbolValue("EditTextOut")
IF sz$ = "CONTINUE" THEN
IF LEN(DEST$) > 0 THEN
IF MID$(DEST$, LEN(DEST$), 1) = ":" THEN
DEST$ = DEST$ + "\"
END IF
END IF
IF IsDirWritable(DEST$) = NO THEN
x$ = WarnBadPath()
GOTO GETPATHINFOSTART
END IF
ELSEIF sz$ = "REACTIVATE" THEN
GOTO GETPATHINFOSTART
ELSE
ConfirmQuit
GOTO GETPATHINFOSTART
END IF
UIPop 1
RemoveSymbol "EditTextIn"
RemoveSymbol "EditTextOut"
END SUB
'**
'** Purpose:
'** Gets the path and PM group where the user wishes to install FoxPro.
'** Arguments:
'** none.
'** Returns:
'** none.
'*************************************************************************
SUB GetPathGrpInfo () STATIC
SetSymbolValue "EditTextIn", DEST$
SetSymbolValue "ListDefault", GROUP$
GETPATHGRPINFOSTART:
sz$ = UIStartDlg(CUIDLL$, DESTPATHGROUP, "FDirGrpProc", 0, "")
DEST$ = GetSymbolValue("EditTextOut")
GROUP$ = GetSymbolValue("ListItemsOut")
IF sz$ = "CONTINUE" THEN
IF LEN(DEST$) > 0 THEN
IF MID$(DEST$, LEN(DEST$), 1) = ":" THEN
DEST$ = DEST$ + "\"
END IF
END IF
IF IsDirWritable(DEST$) = NO THEN
x$ = WarnBadPath()
GOTO GETPATHGRPINFOSTART
END IF
ELSEIF sz$ = "REACTIVATE" THEN
GOTO GETPATHGRPINFOSTART
ELSE
ConfirmQuit
GOTO GETPATHGRPINFOSTART
END IF
UIPop 1
RemoveSymbol "EditTextIn"
RemoveSymbol "EditTextOut"
RemoveSymbol "ListDefault"
RemoveSymbol "ListItemsOut"
END SUB
'**
'** Purpose:
'** Determines if we have enough space to do the install.
'** Arguments:
'** none.
'** Returns:
'** "CONTINUE" or "BACK".
'*************************************************************************
FUNCTION EnoughSpace() STATIC AS STRING
oldCursor% = ShowWaitCursor()
sz$ = UIStartDlg(CUIDLL$, WAITSPACE, "FNoWaitDlgProc", 0, "")
EnoughSpace = "CONTINUE"
SpaceAvail& = GetFreeSpaceForDrive(MID$(DEST$, 1, 1)) / 1024
WinSpaceAvail& = GetFreeSpaceForDrive(MID$(WINSYSDIR$, 1, 1)) / 1024
SpaceNeed& = SectionSize("Application")
WinSpaceNeed& = SectionSize("Sysfiles")
IF fGRAPH% = YES THEN
WinSpaceNeed& = WinSpaceNeed& + SectionSize("MSGraph")
END IF
RestoreCursor oldCursor%
UIPop 1
''
'' If Windows is on the drive we are installing to, combine
'' the needed values.
''
IF MID$(DEST$, 1, 1) = MID$(WINSYSDIR$, 1, 1) THEN
SpaceNeed& = SpaceNeed& + WinSpaceNeed&
END IF
''
'' Check to see if we have room
''
IF SpaceNeed& > SpaceAvail& THEN
IF MODE$ <> "YES" THEN
dialogs% = DISKFULL_BACK
ELSE
dialog% = DISKFULL
END IF
ELSEIF SpaceNeedWin& > SpaceAvailWin& THEN
dialog% = DISKWINFULL
ELSE
dialog% = 0
END IF
IF dialog% > 0 THEN
NOROOM:
sz$ = UIStartDlg(CUIDLL$, dialog%, "FInfoDlgProc", 0, "")
UIPop 1
IF sz$ = "BACK" THEN
EnoughSpace = "BACK"
ELSEIF sz$ = "EXIT" OR sz$ = "CANCEL" THEN
ConfirmQuit
GOTO NOROOM
END IF
END IF
END FUNCTION
'**
'** Purpose:
'** Update FILES in config.sys if needed.
'** Arguments:
'** none.
'** Returns:
'** none.
'*************************************************************************
SUB UpdateConfig STATIC
IF CanFindConfigSys() <> 0 THEN
IF GetConfigNumFiles() < MINFILES% THEN
SetSymbolValue "RadioDefault", "1"
UPDATETYPE:
sz$ = UIStartDlg(CUIDLL$, EDITMODE, "FRadioDlgProc", 0, "")
IF sz$ = "CONTINUE" THEN
UIPop 1
SetSymbolValue "MIN_FILES", "40"
IF GetSymbolValue("ButtonChecked") = "1" THEN
x% = QuietConfigUpdate()
ELSEIF GetSymbolValue("ButtonChecked") = "2" THEN
EDITCONFIGSTART:
sz$ = UIStartDlg(CUIDLL$, EDITCONFIG, "ConfigEditDlg", 0, "")
IF sz$ = "EXIT" or sz$ = "CANCEL" THEN
ConfirmQuit
GOTO EDITCONFIGSTART
ENDIF
UIPop 1
ELSE
GOTO CONFIGEND
ENDIF
IF GetSymbolValue("UPDATE_RESULT") = "ERROR" THEN
sz$ = UIStartDlg(CUIDLL$, CANTUPDATE, "FInfo0DlgProc", 0, "")
ELSE
sz$ = UIStartDlg(CUIDLL$, EDITOK, "FDlgFNameProc", 0, "")
END IF
UIPop 1
ELSE
ConfirmQuit
SetSymbolValue "RadioDefault", GetSymbolValue("ButtonChecked")
GOTO UPDATETYPE
END IF
END IF
CONFIGEND:
ELSE
SetSymbolValue "ConfirmTextIn", ""
AddListItem "ConfirmTextIn", STR$(MINFILES%)
AddListItem "ConfirmTextIn", STR$(MINFILES%)
sz$ = UIStartDlg(CUIDLL$, CANTFIND, "FSprintfDlgProc", 0, "")
UIPop 1
END IF
END SUB
'**
'** Purpose:
'** Confirms that the user really wants to quit when they select a quit
'** option.
'** Arguments:
'** none.
'** Returns:
'** none.
'*************************************************************************
SUB ConfirmQuit STATIC
CONFIRMQUITSTART:
cq$ = UIStartDlg(CUIDLL$, ASKQUIT, "FInfoDlgProc", 0, "")
IF cq$ = "EXIT" or cq$ = "CANCEL" THEN
UIPopAll
ERROR STFQUIT
ELSEIF cq$ = "REACTIVATE" THEN
GOTO CONFIRMQUITSTART
ELSE
UIPop 1
END IF
END SUB
'**
'** Purpose:
'** Warns the user that they have specified an invalid path.
'** Arguments:
'** none.
'** Returns:
'** none.
'*************************************************************************
FUNCTION WarnBadPath () STATIC AS STRING
WARNBADPATHSTART:
sz$ = UIStartDlg(CUIDLL$, BADPATH, "FInfoDlgProc", 0, "")
IF sz$ = "REACTIVATE" THEN
GOTO WARNBADPATHSTART
ELSEIF sz$ = "CANCEL" OR sz$ = "EXIT" THEN
ConfirmQuit
GOTO WARNBADPATHSTART
END IF
UIPop 1
WarnBadPath = sz$
END FUNCTION
'**
'** Purpose:
'** Appends a file name to the end of a directory path,
'** inserting a backslash character as needed.
'** Arguments:
'** szDir$ - full directory path (with optional ending "\")
'** szFile$ - filename to append to directory
'** Returns:
'** Resulting fully qualified path name.
'*************************************************************************
FUNCTION MakePath (szDir$, szFile$) STATIC AS STRING
IF szDir$ = "" THEN
MakePath = szFile$
ELSEIF szFile$ = "" THEN
MakePath = szDir$
ELSEIF MID$(szDir$, LEN(szDir$), 1) = "\" THEN
MakePath = szDir$ + szFile$
ELSE
MakePath = szDir$ + "\" + szFile$
END IF
END FUNCTION
'**
'** Purpose:
'** Sets the global copy list to install a the options selected by
'** the user as indicated by the list CheckItems.
'** Arguments:
'** none.
'** Returns:
'** none.
'*************************************************************************
SUB CreateCopyList () STATIC
ClearCopyList
AddSectionFilesToCopyList "Application", SRCDIR$, DEST$
AddSectionFilesToCopyList "Sysfiles", SRCDIR$, WINSYSDIR$
IF fGRAPH% = YES THEN
AddSectionFilesToCopyList "MSGraph", SRCDIR$, MakePath(MSDEST$,"msgraph")
END IF
END SUB
'**
'** Purpose:
'** Determines how much space a given section will occupy.
'** Arguments:
'** szSection$ - The section to determine the size of.
'** Returns:
'** The size in K bytes of the section.
'*************************************************************************
FUNCTION SectionSize (szSection$) STATIC AS INTEGER
MakeListFromSectionSize "SizeList", szSection$
SectionSize = CalcListSize()
RemoveSymbol "SizeList"
END FUNCTION
'**
'** Purpose:
'** Reads the INF file to get the user's preferences for various
'** settings.
'** Arguments:
'** (NONE)
'** Returns:
'** (NONE)
'*************************************************************************
SUB GetUserDefaults STATIC
'' Get the default window title
y$ = GetIniKeyString(szInf$, "FP SETUP", "TITLE")
z$ = GetIniKeyString(szInf$, "FP SETUP", "COPYRIGHT")
IF LEN(y$) <> 0 THEN
SetSymbolValue "DLG_TITLE", y$
SetTitle y$
IF LEN(z$) <> 0 THEN
SetAbout y$, z$
END IF
ELSE
SetSymbolValue "DLG_TITLE", DEFAULT_TITLE$
END IF
'' Get the default installation directory
y$ = GetIniKeyString(szInf$, "FP SETUP", "PATH")
IF LEN(y$) <> 0 THEN
DEST$ = y$
END IF
'' Get the default installation group
y$ = GetIniKeyString(szInf$, "FP SETUP", "GROUP")
IF LEN(y$) <> 0 THEN
GROUP$ = y$
END IF
SetSymbolValue "FoxProGroup", GROUP$
'' Get the information used when adding stuff to the Program Manager
PM_EXE$ = GetIniKeyString(szInf$, "FP SETUP", "PROGRAM")
PM_DESCRIPT$ = GetIniKeyString(szInf$, "FP SETUP", "DESCRIPT")
'' Get the user's control level
y$ = GetIniKeyString(szInf$, "FP SETUP", "FORCELOC")
IF LEN(y$) <> 0 THEN
MODE$ = y$
END IF
'' Get the program to execute when we quit
QUIT_PROG$ = GetIniKeyString(szInf$, "FP SETUP", "RUN")
END SUB